uni-app IOS App 开发记录

MuYan2022-12-07VueVueuni-app

本地开发调试

开发本地开发调试的时候,需要打测试开发证书的自定义基座。

APP 开发测试

在开发一些需要沙箱环境的功能点时,需要申请 Developer Certification(开发证书)

IOS APP 证书申请流程

应用内测流程

基础需求:macBook 一台,一个 App Store Connect 开发者账户,在 macBook 上安装应用 TestFlight

  1. 登录App Store Connect 官网open in new window

  2. 在 macBook 上安装 TestFlight,登录开发者账户,上传 uniApp 打包后的 IOS 应用包,而后同步至App Store Connect

  3. 在 App Store Connect 上配置 APP 信息,并在对应 APP 内的 TestFlight 内邀请对应的测试人员,Apple ID 需要为邮箱账户才能邀请(因为需要通过邮箱发送邀请链接,内含邀请码,后面要用)

  4. 测试人员通过邮件接受邀请,而后在 iPhone 上安装 TestFlight 并于该应用内填写对应 邀请码(邀请码在内测邀请邮件内)

接入 IAP 支付

苹果规定应用内支付必须要接入接入 IAP 支付,苹果会抽取 30%的手续费(俗称苹果税)

  • 不接入就不能通过审核上架
  • 已上线的应用如果发现相关引导第三方支付、接入第三方支付等情况,会进行强制下架

游客登录

苹果规定内购如无必须要跟账户绑定的情况下,就必须要有游客登录模式,只要审核的驳回理由就有相关说明就必须要接入,无法绕开跟避规!!!老老实实实现游客登录吧!

实现方式

建议开放购买页,而后在用户进行购买的时候进行弹窗提示,让用户选择登录方式

  • 基础示例(基于 uview ui库)
<template>
  <view>
    <u-button @click="submit()">
        购买
    </u-button>
    <view class="loginModal_wrap">
      <u-modal
        :show="loginModalShow && !userInfo"
        title="登录方式选择"
        confirmText="暂不购买"
        @confirm="loginModalShow = false"
      >
        <view style="flex: 1">
          <u-button @click="loginJump()">
            <view>
              <view style="display: flex;">
                <view>
                  登录XXX账户开通
                </view>
                <u-tag text="推荐" shape="circle" color="#fff" />
              </view>
              <view> (可在 <text>不同设备</text> 享受会员权益) </view>
            </view>
          </u-button>
          <u-button @click="loginJump(true)">
            <view>
              游客账户开通
              <view> (可在 <text>当前设备</text> 享受会员权益) </view>
            </view>
          </u-button>
        </view>
      </u-modal>
    </view>
  </view>
</template>
<script>
/**
  * app 开发,苹果设备判断
  * @returns
*/
const isIOS = () => {
  // #ifdef APP-PLUS
  return uni.getSystemInfoSync().osName === 'ios';
  // #endif
  // #ifndef APP-PLUS
  return false;
  // #endif
}
export default {
    data() {
        return {
            loginModalShow: false
            userInfo: '' // 用户登录信息
        };
    },
    methods: {
        submit() {
            // 未登录
            if (!this.userInfo) {
                // 苹果端显示登陆方式选择
                if (isIOS()) {
                    this.loginModalShow = true;
                } else {
                    // 其他端跳转登录
                }
                // 登录后业务逻辑
            }
        },
        loginJump(type = false) {
            if (!type) {
                this.loginModalShow = false;
                // 跳转登录页
                return;
            }
            // #ifdef APP-PLUS
            if (this.$myUtils.isIOS()) {
                plus.device.getInfo({
                    success: (e) => {
                    if (e.uuid) {
                        // 苹果设备唯一标识 uuid,当前应用内唯一
                        // getLogin 为你自定义的登录方法
                        this.getLogin({
                            uuid: e.uuid
                        }).then(() => {
                            uni.showToast({
                                title: "登录成功",
                                duration: 2000,
                            });
                            this.loginModalShow = false;
                        });
                    }
                    },
                    fail: () => {
                        uni.showToast({
                            title: "登录失败",
                            duration: 2000,
                        });
                    },
                });
            } else {
                this.loginModalShow = false;
            }
            // #endif
            // #ifndef APP-PLUS
            this.loginModalShow = false;
            // #endif
        }
    }
}
</script>

苹果接入第三方登录

苹果规定接入第三方登录(如微信、微博等),必须要接入苹果登录,不然不能上架,苹果登录最低支持苹果系统13+

// 获取苹果登录相关信息
const getIosLoginInfo = () => {
  return new Promise((resolve, reject) => {
    // #ifdef APP-PLUS
    uni.login({
      provider: 'apple',
      success: () => {
        uni.getUserInfo({
          provider: 'apple',
          success: (info) => {
            // info.userInfo 包含以下信息
            // openId 苹果用户唯一标识符,该值在同一开发者账户下的所有APP下是一样的
            // authorizationCode 服务器验证需要使用的参数
            // identityToken 服务器验证需要使用的参数,校验用户数据是否真实
            // realUserStatus 用于判断当前登录的苹果账号是否是一个真实用户 0:当前平台不支持,忽略该值;1:无法确认;2:用户真实性非常高
            // 基本上可以根据 openId、identityToken 就可以进行苹果账户登录操作,如需更多用户信息,请查阅相关文档
            resolve(info.userInfo)
          },
        });
      },
      fail: (err) => {
        reject(err)
      },
    });
    // #endif
    // #ifndef APP-PLUS
    resolve('')
    // #endif
  })
}

// 判断是否支持苹果登录
const isIOS13 = () => {
  const info = uni.getSystemInfoSync();
  return info.osName === 'ios' && info.osVersion >= '13'
}

Identifiers 相关

在苹果开发者后台open in new window的Identifiers菜单栏内新增功能时,需要重新生成p12、描述文件,进行应用打包

无法创建证书的情况

创建的时候提示 You already have a current Distribution certificate or a pending certificaterequest. 大概率是创建的 Apple Distribution 证书到达上限了,再苹果开发官网可以查到 Maximum number of certificates generated 这个时候就要只新建 iOS Distribution 类型的证书。

  • Apple Distribution 类型的证书存在上限。
上次更新 2026/6/23 11:49:15